//
//  ViewController.m
//  JKNSURLRequest
//
//  Created by 王冲 on 2019/1/25.
//  Copyright © 2019年 JK科技有限公司. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.view.backgroundColor = [UIColor whiteColor];
    
    
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    
    [self demo3];
   
}

#pragma mark plist 解析
-(void)demo3{
    
    // 1.编码  plist 很少用于传输网络数据，在苹果端用的比较多
    NSString *urlStr = [@"http://localhost/messages.plist" stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
    
    NSURL *url = [NSURL URLWithString:urlStr];
    
    NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url];
    
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
        
        /*
         NSPropertyListImmutable 不可变
         NSPropertyListMutableContainers 容器可变
         NSPropertyListMutableContainersAndLeaves 容器和子节点都可变
         */
        
        //NSJSON(JSON)Serialization(序列化)
        //NSPropertyList(属性列表)Serialization（序列化）
        id result = [NSPropertyListSerialization propertyListWithData:data options:0 format:NULL error:NULL];
        
        NSLog(@"result=%@  class=%@",result,[result class]);
    }];
}

#pragma mark json 解析
-(void)demo2{
    
    // 1.编码
    NSString *urlStr = [@"http://localhost/test.json" stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
    
    NSURL *url = [NSURL URLWithString:urlStr];
    
    NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url];
    
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
        
        // NSLog(@"NSThread=%@ ",[NSThread currentThread]);
        
        NSString *json = [[NSString alloc]initWithData:data encoding:kCFStringEncodingUTF8];
        NSLog(@"json=%@",json);
        
        id result = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
        NSLog(@"result=%@  类型=%@",result,[result class]);
        
    }];
}

#pragma mark NSURLRequest基本的认识
-(void)demo1{
    
    /*
     为什么NSData方法在实际开发中用不到
     1.因为超时时长，60s,没法修改，而且没有缓存策略
     2.dataWithContentsOfURL：同步方法
     3.没有错误处理机制
     */
    
    //    //1.NSData能不能请求网络
    //    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://127.0.0.1/demo.json"]];
    //    NSString *json = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
    //
    //    NSLog(@"%@",json);
    
    
    // 1.编码
    NSString *urlStr = [@"http://localhost/test.json" stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
    
    NSURL *url = [NSURL URLWithString:urlStr];
    
    // 2.NSURLRequest
    /*
     
     *timeoutInterval:超时时长
     一般在开发中建议:15s-30s,太短服务器来不及反应，太长用户体验不好
     -SDWebImaeg, 默认时长 15s
     -AFNetWorking  默认时长 60s
     
     * cachePolicy
     
     NSURLRequestUseProtocolCachePolicy 0 默认缓存策略
     NSURLRequestReload（刷新）Ignoring（忽略）Local（本地）CacheData（缓存数据） 1
     忽略本地缓存数据，直接加载网络数据，每次都是最新数据
     应用场景：数据变化比较快非常频繁的APP,彩票
     
     NSURLRequestReturnCacheDataElseLoad = 2 返回缓存数据，如果没有缓存从服务器加载
     NSURLRequestReturnCacheDataDontLoad = 3 返回缓存数据，如果没有缓存，空着！！！
     */
    NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url];
    
    // 3.链接：发送请求---异步发送、错误处理机制
    /*
     
     * 1.request --索要资源的请求
     * 2.queue ---调度任务队列
     指定回调队列代码块的队列！
     主队列：回调代码块在主线程上执行
     新建队列：就会在其他线程上执行你的回调代码
     
     * 3.block ---回调代码块，在网络请求结束后执行！
     *3.1 response 服务器的响应
     URL           服务器返回的URl,绝大部分都和请求URL是一样的，有时候不一样，“重定向”
     MIMEType      二进制数据的文件类型，服务器会告诉客户端，用什么打开二进制数据
     expectedContentLength  下载文件的长度
     textEncodingName      文件编码名称 大多数的UT8
     suggestedFilename     服务器建议保存的文件名称
     statusCode;           状态码 2XX 3XX重定向  4XX客户端错误 5XX服务器错误
     allHeaderFields       所有响应头的内容
     * data 数据实体，程序员最关注的部分
     * connectionError 错误提示
     注意：有一种情况没有错误，也没有数据
     if(connectionError || data == nil)
     {
     NSLog(@“你的网络不给力，请稍后重试！”)；
     }
     
     */
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
        
        NSLog(@"NSThread=%@ \n response=%@",[NSThread currentThread],response);
        
        NSString *json = [[NSString alloc]initWithData:data encoding:kCFStringEncodingUTF8];
        
        NSLog(@"json=%@",json);
    }];
}


@end
